1.思路
用兩個數one=0、two=0分別記錄bits位上1出現的次數,如果一個數出現一次,則one等於這個數,two=0; 如果一個數出現兩次,則two等於這個數, one等於0;如果一個數出現第三次,則one = 0, two = 0 ,three等於這個數。
我們以數組{2, 1, 2, 2}爲例:
初始: one = 0, two = 0 three
a. 數字2加入其中,則 one = 10(對應的10進製爲2),two = 0
b. 數字1加入其中,則one = 11(對應的10進製爲3),two = 0, two等於0表明前面兩個數字沒有重複的位
c. 數字2加入其中, 則one = 1(對應的10進製爲1), two = 10(對應的10進製爲2), two等於2表明前面三個數字有重複的位
d.數字2加入其中,則one = 11 (對應的10進製爲3), two = 10(對應的10進製爲2), three = one & two = 10(十進制爲2),表明有數字位重複出現3次,one = one & (^three), two = two &(^three),去掉one和two中與three相同的位,即去掉了出現3次的數字
算法: one = 0 two = 0 three
two |= one & t
one ^= t
three = one & two
one &= (^three) 如果用python,則該處對應的是 one &= (~three)
two &= (^three) 如果用python,則該處對應的是 two &= (~three)
代碼如下:
func singleNumber(nums []int) int {
var one = 0
var two = 0
var three int
for i:= 0; i < len(nums); i++ {
temp := nums[i]
two |= one & temp
one ^= temp
three = one & two
one &= ^three
two &= ^three
}
return one
}